<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>24.2. cmd — Support for line-oriented command interpreters &mdash; Python 3.4.3 documentation</title>
    
    <link rel="stylesheet" href="../_static/pydoctheme.css" type="text/css" />
    <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
    
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '../',
        VERSION:     '3.4.3',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true
      };
    </script>
    <script type="text/javascript" src="../_static/jquery.js"></script>
    <script type="text/javascript" src="../_static/underscore.js"></script>
    <script type="text/javascript" src="../_static/doctools.js"></script>
    <script type="text/javascript" src="../_static/sidebar.js"></script>
    <link rel="search" type="application/opensearchdescription+xml"
          title="Search within Python 3.4.3 documentation"
          href="../_static/opensearch.xml"/>
    <link rel="author" title="About these documents" href="../about.html" />
    <link rel="copyright" title="Copyright" href="../copyright.html" />
    <link rel="top" title="Python 3.4.3 documentation" href="../index.html" />
    <link rel="up" title="24. Program Frameworks" href="frameworks.html" />
    <link rel="next" title="24.3. shlex — Simple lexical analysis" href="shlex.html" />
    <link rel="prev" title="24.1. turtle — Turtle graphics" href="turtle.html" />
    <link rel="shortcut icon" type="image/png" href="../_static/py.png" />
    <script type="text/javascript" src="../_static/copybutton.js"></script>
    <script type="text/javascript" src="../_static/version_switch.js"></script>
    
 

  </head>
  <body>  
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="../genindex.html" title="General Index"
             accesskey="I">index</a></li>
        <li class="right" >
          <a href="../py-modindex.html" title="Python Module Index"
             >modules</a> |</li>
        <li class="right" >
          <a href="shlex.html" title="24.3. shlex — Simple lexical analysis"
             accesskey="N">next</a> |</li>
        <li class="right" >
          <a href="turtle.html" title="24.1. turtle — Turtle graphics"
             accesskey="P">previous</a> |</li>
        <li><img src="../_static/py.png" alt=""
                 style="vertical-align: middle; margin-top: -1px"/></li>
        <li><a href="https://www.python.org/">Python</a> &raquo;</li>
        <li>
          <span class="version_switcher_placeholder">3.4.3</span>
          <a href="../index.html">Documentation</a> &raquo;
        </li>

          <li><a href="index.html" >The Python Standard Library</a> &raquo;</li>
          <li><a href="frameworks.html" accesskey="U">24. Program Frameworks</a> &raquo;</li> 
      </ul>
    </div>    

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
            
  <div class="section" id="module-cmd">
<span id="cmd-support-for-line-oriented-command-interpreters"></span><h1>24.2. <a class="reference internal" href="#module-cmd" title="cmd: Build line-oriented command interpreters."><tt class="xref py py-mod docutils literal"><span class="pre">cmd</span></tt></a> &#8212; Support for line-oriented command interpreters<a class="headerlink" href="#module-cmd" title="Permalink to this headline">¶</a></h1>
<p><strong>Source code:</strong> <a class="reference external" href="https://hg.python.org/cpython/file/3.4/Lib/cmd.py">Lib/cmd.py</a></p>
<hr class="docutils" />
<p>The <a class="reference internal" href="#cmd.Cmd" title="cmd.Cmd"><tt class="xref py py-class docutils literal"><span class="pre">Cmd</span></tt></a> class provides a simple framework for writing line-oriented
command interpreters.  These are often useful for test harnesses, administrative
tools, and prototypes that will later be wrapped in a more sophisticated
interface.</p>
<dl class="class">
<dt id="cmd.Cmd">
<em class="property">class </em><tt class="descclassname">cmd.</tt><tt class="descname">Cmd</tt><big>(</big><em>completekey='tab'</em>, <em>stdin=None</em>, <em>stdout=None</em><big>)</big><a class="headerlink" href="#cmd.Cmd" title="Permalink to this definition">¶</a></dt>
<dd><p>A <a class="reference internal" href="#cmd.Cmd" title="cmd.Cmd"><tt class="xref py py-class docutils literal"><span class="pre">Cmd</span></tt></a> instance or subclass instance is a line-oriented interpreter
framework.  There is no good reason to instantiate <a class="reference internal" href="#cmd.Cmd" title="cmd.Cmd"><tt class="xref py py-class docutils literal"><span class="pre">Cmd</span></tt></a> itself; rather,
it&#8217;s useful as a superclass of an interpreter class you define yourself in order
to inherit <a class="reference internal" href="#cmd.Cmd" title="cmd.Cmd"><tt class="xref py py-class docutils literal"><span class="pre">Cmd</span></tt></a>&#8216;s methods and encapsulate action methods.</p>
<p>The optional argument <em>completekey</em> is the <a class="reference internal" href="readline.html#module-readline" title="readline: GNU readline support for Python. (Unix)"><tt class="xref py py-mod docutils literal"><span class="pre">readline</span></tt></a> name of a completion
key; it defaults to <tt class="kbd docutils literal"><span class="pre">Tab</span></tt>. If <em>completekey</em> is not <a class="reference internal" href="constants.html#None" title="None"><tt class="xref py py-const docutils literal"><span class="pre">None</span></tt></a> and
<a class="reference internal" href="readline.html#module-readline" title="readline: GNU readline support for Python. (Unix)"><tt class="xref py py-mod docutils literal"><span class="pre">readline</span></tt></a> is available, command completion is done automatically.</p>
<p>The optional arguments <em>stdin</em> and <em>stdout</em> specify the  input and output file
objects that the Cmd instance or subclass  instance will use for input and
output. If not specified, they will default to <a class="reference internal" href="sys.html#sys.stdin" title="sys.stdin"><tt class="xref py py-data docutils literal"><span class="pre">sys.stdin</span></tt></a> and
<a class="reference internal" href="sys.html#sys.stdout" title="sys.stdout"><tt class="xref py py-data docutils literal"><span class="pre">sys.stdout</span></tt></a>.</p>
<p>If you want a given <em>stdin</em> to be used, make sure to set the instance&#8217;s
<a class="reference internal" href="#cmd.Cmd.use_rawinput" title="cmd.Cmd.use_rawinput"><tt class="xref py py-attr docutils literal"><span class="pre">use_rawinput</span></tt></a> attribute to <tt class="docutils literal"><span class="pre">False</span></tt>, otherwise <em>stdin</em> will be
ignored.</p>
</dd></dl>

<div class="section" id="cmd-objects">
<span id="id1"></span><h2>24.2.1. Cmd Objects<a class="headerlink" href="#cmd-objects" title="Permalink to this headline">¶</a></h2>
<p>A <a class="reference internal" href="#cmd.Cmd" title="cmd.Cmd"><tt class="xref py py-class docutils literal"><span class="pre">Cmd</span></tt></a> instance has the following methods:</p>
<dl class="method">
<dt id="cmd.Cmd.cmdloop">
<tt class="descclassname">Cmd.</tt><tt class="descname">cmdloop</tt><big>(</big><em>intro=None</em><big>)</big><a class="headerlink" href="#cmd.Cmd.cmdloop" title="Permalink to this definition">¶</a></dt>
<dd><p>Repeatedly issue a prompt, accept input, parse an initial prefix off the
received input, and dispatch to action methods, passing them the remainder of
the line as argument.</p>
<p>The optional argument is a banner or intro string to be issued before the first
prompt (this overrides the <a class="reference internal" href="#cmd.Cmd.intro" title="cmd.Cmd.intro"><tt class="xref py py-attr docutils literal"><span class="pre">intro</span></tt></a> class attribute).</p>
<p>If the <a class="reference internal" href="readline.html#module-readline" title="readline: GNU readline support for Python. (Unix)"><tt class="xref py py-mod docutils literal"><span class="pre">readline</span></tt></a> module is loaded, input will automatically inherit
<strong class="program">bash</strong>-like history-list editing (e.g. <tt class="kbd docutils literal"><span class="pre">Control-P</span></tt> scrolls back
to the last command, <tt class="kbd docutils literal"><span class="pre">Control-N</span></tt> forward to the next one, <tt class="kbd docutils literal"><span class="pre">Control-F</span></tt>
moves the cursor to the right non-destructively, <tt class="kbd docutils literal"><span class="pre">Control-B</span></tt> moves the
cursor to the left non-destructively, etc.).</p>
<p>An end-of-file on input is passed back as the string <tt class="docutils literal"><span class="pre">'EOF'</span></tt>.</p>
<p>An interpreter instance will recognize a command name <tt class="docutils literal"><span class="pre">foo</span></tt> if and only if it
has a method <tt class="xref py py-meth docutils literal"><span class="pre">do_foo()</span></tt>.  As a special case, a line beginning with the
character <tt class="docutils literal"><span class="pre">'?'</span></tt> is dispatched to the method <tt class="xref py py-meth docutils literal"><span class="pre">do_help()</span></tt>.  As another
special case, a line beginning with the character <tt class="docutils literal"><span class="pre">'!'</span></tt> is dispatched to the
method <tt class="xref py py-meth docutils literal"><span class="pre">do_shell()</span></tt> (if such a method is defined).</p>
<p>This method will return when the <a class="reference internal" href="#cmd.Cmd.postcmd" title="cmd.Cmd.postcmd"><tt class="xref py py-meth docutils literal"><span class="pre">postcmd()</span></tt></a> method returns a true value.
The <em>stop</em> argument to <a class="reference internal" href="#cmd.Cmd.postcmd" title="cmd.Cmd.postcmd"><tt class="xref py py-meth docutils literal"><span class="pre">postcmd()</span></tt></a> is the return value from the command&#8217;s
corresponding <tt class="xref py py-meth docutils literal"><span class="pre">do_*()</span></tt> method.</p>
<p>If completion is enabled, completing commands will be done automatically, and
completing of commands args is done by calling <tt class="xref py py-meth docutils literal"><span class="pre">complete_foo()</span></tt> with
arguments <em>text</em>, <em>line</em>, <em>begidx</em>, and <em>endidx</em>.  <em>text</em> is the string prefix
we are attempting to match: all returned matches must begin with it. <em>line</em> is
the current input line with leading whitespace removed, <em>begidx</em> and <em>endidx</em>
are the beginning and ending indexes of the prefix text, which could be used to
provide different completion depending upon which position the argument is in.</p>
<p>All subclasses of <a class="reference internal" href="#cmd.Cmd" title="cmd.Cmd"><tt class="xref py py-class docutils literal"><span class="pre">Cmd</span></tt></a> inherit a predefined <tt class="xref py py-meth docutils literal"><span class="pre">do_help()</span></tt>.  This
method, called with an argument <tt class="docutils literal"><span class="pre">'bar'</span></tt>, invokes the corresponding method
<tt class="xref py py-meth docutils literal"><span class="pre">help_bar()</span></tt>, and if that is not present, prints the docstring of
<tt class="xref py py-meth docutils literal"><span class="pre">do_bar()</span></tt>, if available.  With no argument, <tt class="xref py py-meth docutils literal"><span class="pre">do_help()</span></tt> lists all
available help topics (that is, all commands with corresponding
<tt class="xref py py-meth docutils literal"><span class="pre">help_*()</span></tt> methods or commands that have docstrings), and also lists any
undocumented commands.</p>
</dd></dl>

<dl class="method">
<dt id="cmd.Cmd.onecmd">
<tt class="descclassname">Cmd.</tt><tt class="descname">onecmd</tt><big>(</big><em>str</em><big>)</big><a class="headerlink" href="#cmd.Cmd.onecmd" title="Permalink to this definition">¶</a></dt>
<dd><p>Interpret the argument as though it had been typed in response to the prompt.
This may be overridden, but should not normally need to be; see the
<a class="reference internal" href="#cmd.Cmd.precmd" title="cmd.Cmd.precmd"><tt class="xref py py-meth docutils literal"><span class="pre">precmd()</span></tt></a> and <a class="reference internal" href="#cmd.Cmd.postcmd" title="cmd.Cmd.postcmd"><tt class="xref py py-meth docutils literal"><span class="pre">postcmd()</span></tt></a> methods for useful execution hooks.  The
return value is a flag indicating whether interpretation of commands by the
interpreter should stop.  If there is a <tt class="xref py py-meth docutils literal"><span class="pre">do_*()</span></tt> method for the command
<em>str</em>, the return value of that method is returned, otherwise the return value
from the <a class="reference internal" href="#cmd.Cmd.default" title="cmd.Cmd.default"><tt class="xref py py-meth docutils literal"><span class="pre">default()</span></tt></a> method is returned.</p>
</dd></dl>

<dl class="method">
<dt id="cmd.Cmd.emptyline">
<tt class="descclassname">Cmd.</tt><tt class="descname">emptyline</tt><big>(</big><big>)</big><a class="headerlink" href="#cmd.Cmd.emptyline" title="Permalink to this definition">¶</a></dt>
<dd><p>Method called when an empty line is entered in response to the prompt. If this
method is not overridden, it repeats the last nonempty command entered.</p>
</dd></dl>

<dl class="method">
<dt id="cmd.Cmd.default">
<tt class="descclassname">Cmd.</tt><tt class="descname">default</tt><big>(</big><em>line</em><big>)</big><a class="headerlink" href="#cmd.Cmd.default" title="Permalink to this definition">¶</a></dt>
<dd><p>Method called on an input line when the command prefix is not recognized. If
this method is not overridden, it prints an error message and returns.</p>
</dd></dl>

<dl class="method">
<dt id="cmd.Cmd.completedefault">
<tt class="descclassname">Cmd.</tt><tt class="descname">completedefault</tt><big>(</big><em>text</em>, <em>line</em>, <em>begidx</em>, <em>endidx</em><big>)</big><a class="headerlink" href="#cmd.Cmd.completedefault" title="Permalink to this definition">¶</a></dt>
<dd><p>Method called to complete an input line when no command-specific
<tt class="xref py py-meth docutils literal"><span class="pre">complete_*()</span></tt> method is available.  By default, it returns an empty list.</p>
</dd></dl>

<dl class="method">
<dt id="cmd.Cmd.precmd">
<tt class="descclassname">Cmd.</tt><tt class="descname">precmd</tt><big>(</big><em>line</em><big>)</big><a class="headerlink" href="#cmd.Cmd.precmd" title="Permalink to this definition">¶</a></dt>
<dd><p>Hook method executed just before the command line <em>line</em> is interpreted, but
after the input prompt is generated and issued.  This method is a stub in
<a class="reference internal" href="#cmd.Cmd" title="cmd.Cmd"><tt class="xref py py-class docutils literal"><span class="pre">Cmd</span></tt></a>; it exists to be overridden by subclasses.  The return value is
used as the command which will be executed by the <a class="reference internal" href="#cmd.Cmd.onecmd" title="cmd.Cmd.onecmd"><tt class="xref py py-meth docutils literal"><span class="pre">onecmd()</span></tt></a> method; the
<a class="reference internal" href="#cmd.Cmd.precmd" title="cmd.Cmd.precmd"><tt class="xref py py-meth docutils literal"><span class="pre">precmd()</span></tt></a> implementation may re-write the command or simply return <em>line</em>
unchanged.</p>
</dd></dl>

<dl class="method">
<dt id="cmd.Cmd.postcmd">
<tt class="descclassname">Cmd.</tt><tt class="descname">postcmd</tt><big>(</big><em>stop</em>, <em>line</em><big>)</big><a class="headerlink" href="#cmd.Cmd.postcmd" title="Permalink to this definition">¶</a></dt>
<dd><p>Hook method executed just after a command dispatch is finished.  This method is
a stub in <a class="reference internal" href="#cmd.Cmd" title="cmd.Cmd"><tt class="xref py py-class docutils literal"><span class="pre">Cmd</span></tt></a>; it exists to be overridden by subclasses.  <em>line</em> is the
command line which was executed, and <em>stop</em> is a flag which indicates whether
execution will be terminated after the call to <a class="reference internal" href="#cmd.Cmd.postcmd" title="cmd.Cmd.postcmd"><tt class="xref py py-meth docutils literal"><span class="pre">postcmd()</span></tt></a>; this will be the
return value of the <a class="reference internal" href="#cmd.Cmd.onecmd" title="cmd.Cmd.onecmd"><tt class="xref py py-meth docutils literal"><span class="pre">onecmd()</span></tt></a> method.  The return value of this method will
be used as the new value for the internal flag which corresponds to <em>stop</em>;
returning false will cause interpretation to continue.</p>
</dd></dl>

<dl class="method">
<dt id="cmd.Cmd.preloop">
<tt class="descclassname">Cmd.</tt><tt class="descname">preloop</tt><big>(</big><big>)</big><a class="headerlink" href="#cmd.Cmd.preloop" title="Permalink to this definition">¶</a></dt>
<dd><p>Hook method executed once when <a class="reference internal" href="#cmd.Cmd.cmdloop" title="cmd.Cmd.cmdloop"><tt class="xref py py-meth docutils literal"><span class="pre">cmdloop()</span></tt></a> is called.  This method is a stub
in <a class="reference internal" href="#cmd.Cmd" title="cmd.Cmd"><tt class="xref py py-class docutils literal"><span class="pre">Cmd</span></tt></a>; it exists to be overridden by subclasses.</p>
</dd></dl>

<dl class="method">
<dt id="cmd.Cmd.postloop">
<tt class="descclassname">Cmd.</tt><tt class="descname">postloop</tt><big>(</big><big>)</big><a class="headerlink" href="#cmd.Cmd.postloop" title="Permalink to this definition">¶</a></dt>
<dd><p>Hook method executed once when <a class="reference internal" href="#cmd.Cmd.cmdloop" title="cmd.Cmd.cmdloop"><tt class="xref py py-meth docutils literal"><span class="pre">cmdloop()</span></tt></a> is about to return. This method
is a stub in <a class="reference internal" href="#cmd.Cmd" title="cmd.Cmd"><tt class="xref py py-class docutils literal"><span class="pre">Cmd</span></tt></a>; it exists to be overridden by subclasses.</p>
</dd></dl>

<p>Instances of <a class="reference internal" href="#cmd.Cmd" title="cmd.Cmd"><tt class="xref py py-class docutils literal"><span class="pre">Cmd</span></tt></a> subclasses have some public instance variables:</p>
<dl class="attribute">
<dt id="cmd.Cmd.prompt">
<tt class="descclassname">Cmd.</tt><tt class="descname">prompt</tt><a class="headerlink" href="#cmd.Cmd.prompt" title="Permalink to this definition">¶</a></dt>
<dd><p>The prompt issued to solicit input.</p>
</dd></dl>

<dl class="attribute">
<dt id="cmd.Cmd.identchars">
<tt class="descclassname">Cmd.</tt><tt class="descname">identchars</tt><a class="headerlink" href="#cmd.Cmd.identchars" title="Permalink to this definition">¶</a></dt>
<dd><p>The string of characters accepted for the command prefix.</p>
</dd></dl>

<dl class="attribute">
<dt id="cmd.Cmd.lastcmd">
<tt class="descclassname">Cmd.</tt><tt class="descname">lastcmd</tt><a class="headerlink" href="#cmd.Cmd.lastcmd" title="Permalink to this definition">¶</a></dt>
<dd><p>The last nonempty command prefix seen.</p>
</dd></dl>

<dl class="attribute">
<dt id="cmd.Cmd.cmdqueue">
<tt class="descclassname">Cmd.</tt><tt class="descname">cmdqueue</tt><a class="headerlink" href="#cmd.Cmd.cmdqueue" title="Permalink to this definition">¶</a></dt>
<dd><p>A list of queued input lines.  The cmdqueue list is checked in
<a class="reference internal" href="#cmd.Cmd.cmdloop" title="cmd.Cmd.cmdloop"><tt class="xref py py-meth docutils literal"><span class="pre">cmdloop()</span></tt></a> when new input is needed; if it is nonempty, its elements
will be processed in order, as if entered at the prompt.</p>
</dd></dl>

<dl class="attribute">
<dt id="cmd.Cmd.intro">
<tt class="descclassname">Cmd.</tt><tt class="descname">intro</tt><a class="headerlink" href="#cmd.Cmd.intro" title="Permalink to this definition">¶</a></dt>
<dd><p>A string to issue as an intro or banner.  May be overridden by giving the
<a class="reference internal" href="#cmd.Cmd.cmdloop" title="cmd.Cmd.cmdloop"><tt class="xref py py-meth docutils literal"><span class="pre">cmdloop()</span></tt></a> method an argument.</p>
</dd></dl>

<dl class="attribute">
<dt id="cmd.Cmd.doc_header">
<tt class="descclassname">Cmd.</tt><tt class="descname">doc_header</tt><a class="headerlink" href="#cmd.Cmd.doc_header" title="Permalink to this definition">¶</a></dt>
<dd><p>The header to issue if the help output has a section for documented commands.</p>
</dd></dl>

<dl class="attribute">
<dt id="cmd.Cmd.misc_header">
<tt class="descclassname">Cmd.</tt><tt class="descname">misc_header</tt><a class="headerlink" href="#cmd.Cmd.misc_header" title="Permalink to this definition">¶</a></dt>
<dd><p>The header to issue if the help output has a section for miscellaneous  help
topics (that is, there are <tt class="xref py py-meth docutils literal"><span class="pre">help_*()</span></tt> methods without corresponding
<tt class="xref py py-meth docutils literal"><span class="pre">do_*()</span></tt> methods).</p>
</dd></dl>

<dl class="attribute">
<dt id="cmd.Cmd.undoc_header">
<tt class="descclassname">Cmd.</tt><tt class="descname">undoc_header</tt><a class="headerlink" href="#cmd.Cmd.undoc_header" title="Permalink to this definition">¶</a></dt>
<dd><p>The header to issue if the help output has a section for undocumented  commands
(that is, there are <tt class="xref py py-meth docutils literal"><span class="pre">do_*()</span></tt> methods without corresponding <tt class="xref py py-meth docutils literal"><span class="pre">help_*()</span></tt>
methods).</p>
</dd></dl>

<dl class="attribute">
<dt id="cmd.Cmd.ruler">
<tt class="descclassname">Cmd.</tt><tt class="descname">ruler</tt><a class="headerlink" href="#cmd.Cmd.ruler" title="Permalink to this definition">¶</a></dt>
<dd><p>The character used to draw separator lines under the help-message headers.  If
empty, no ruler line is drawn.  It defaults to <tt class="docutils literal"><span class="pre">'='</span></tt>.</p>
</dd></dl>

<dl class="attribute">
<dt id="cmd.Cmd.use_rawinput">
<tt class="descclassname">Cmd.</tt><tt class="descname">use_rawinput</tt><a class="headerlink" href="#cmd.Cmd.use_rawinput" title="Permalink to this definition">¶</a></dt>
<dd><p>A flag, defaulting to true.  If true, <a class="reference internal" href="#cmd.Cmd.cmdloop" title="cmd.Cmd.cmdloop"><tt class="xref py py-meth docutils literal"><span class="pre">cmdloop()</span></tt></a> uses <a class="reference internal" href="functions.html#input" title="input"><tt class="xref py py-func docutils literal"><span class="pre">input()</span></tt></a> to
display a prompt and read the next command; if false, <tt class="xref py py-meth docutils literal"><span class="pre">sys.stdout.write()</span></tt>
and <tt class="xref py py-meth docutils literal"><span class="pre">sys.stdin.readline()</span></tt> are used. (This means that by importing
<a class="reference internal" href="readline.html#module-readline" title="readline: GNU readline support for Python. (Unix)"><tt class="xref py py-mod docutils literal"><span class="pre">readline</span></tt></a>, on systems that support it, the interpreter will automatically
support <strong class="program">Emacs</strong>-like line editing  and command-history keystrokes.)</p>
</dd></dl>

</div>
<div class="section" id="cmd-example">
<span id="id2"></span><h2>24.2.2. Cmd Example<a class="headerlink" href="#cmd-example" title="Permalink to this headline">¶</a></h2>
<p>The <a class="reference internal" href="#module-cmd" title="cmd: Build line-oriented command interpreters."><tt class="xref py py-mod docutils literal"><span class="pre">cmd</span></tt></a> module is mainly useful for building custom shells that let a
user work with a program interactively.</p>
<p>This section presents a simple example of how to build a shell around a few of
the commands in the <a class="reference internal" href="turtle.html#module-turtle" title="turtle: An educational framework for simple graphics applications"><tt class="xref py py-mod docutils literal"><span class="pre">turtle</span></tt></a> module.</p>
<p>Basic turtle commands such as <a class="reference internal" href="turtle.html#turtle.forward" title="turtle.forward"><tt class="xref py py-meth docutils literal"><span class="pre">forward()</span></tt></a> are added to a
<a class="reference internal" href="#cmd.Cmd" title="cmd.Cmd"><tt class="xref py py-class docutils literal"><span class="pre">Cmd</span></tt></a> subclass with method named <tt class="xref py py-meth docutils literal"><span class="pre">do_forward()</span></tt>.  The argument is
converted to a number and dispatched to the turtle module.  The docstring is
used in the help utility provided by the shell.</p>
<p>The example also includes a basic record and playback facility implemented with
the <a class="reference internal" href="#cmd.Cmd.precmd" title="cmd.Cmd.precmd"><tt class="xref py py-meth docutils literal"><span class="pre">precmd()</span></tt></a> method which is responsible for converting the input to
lowercase and writing the commands to a file.  The <tt class="xref py py-meth docutils literal"><span class="pre">do_playback()</span></tt> method
reads the file and adds the recorded commands to the <tt class="xref py py-attr docutils literal"><span class="pre">cmdqueue</span></tt> for
immediate playback:</p>
<div class="highlight-python3"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">cmd</span><span class="o">,</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">turtle</span> <span class="k">import</span> <span class="o">*</span>

<span class="k">class</span> <span class="nc">TurtleShell</span><span class="p">(</span><span class="n">cmd</span><span class="o">.</span><span class="n">Cmd</span><span class="p">):</span>
    <span class="n">intro</span> <span class="o">=</span> <span class="s">&#39;Welcome to the turtle shell.   Type help or ? to list commands.</span><span class="se">\n</span><span class="s">&#39;</span>
    <span class="n">prompt</span> <span class="o">=</span> <span class="s">&#39;(turtle) &#39;</span>
    <span class="n">file</span> <span class="o">=</span> <span class="k">None</span>

    <span class="c"># ----- basic turtle commands -----</span>
    <span class="k">def</span> <span class="nf">do_forward</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s">&#39;Move the turtle forward by the specified distance:  FORWARD 10&#39;</span>
        <span class="n">forward</span><span class="p">(</span><span class="o">*</span><span class="n">parse</span><span class="p">(</span><span class="n">arg</span><span class="p">))</span>
    <span class="k">def</span> <span class="nf">do_right</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s">&#39;Turn turtle right by given number of degrees:  RIGHT 20&#39;</span>
        <span class="n">right</span><span class="p">(</span><span class="o">*</span><span class="n">parse</span><span class="p">(</span><span class="n">arg</span><span class="p">))</span>
    <span class="k">def</span> <span class="nf">do_left</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s">&#39;Turn turtle left by given number of degrees:  LEFT 90&#39;</span>
        <span class="n">left</span><span class="p">(</span><span class="o">*</span><span class="n">parse</span><span class="p">(</span><span class="n">arg</span><span class="p">))</span>
    <span class="k">def</span> <span class="nf">do_goto</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s">&#39;Move turtle to an absolute position with changing orientation.  GOTO 100 200&#39;</span>
        <span class="n">goto</span><span class="p">(</span><span class="o">*</span><span class="n">parse</span><span class="p">(</span><span class="n">arg</span><span class="p">))</span>
    <span class="k">def</span> <span class="nf">do_home</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s">&#39;Return turtle to the home position:  HOME&#39;</span>
        <span class="n">home</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">do_circle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s">&#39;Draw circle with given radius an options extent and steps:  CIRCLE 50&#39;</span>
        <span class="n">circle</span><span class="p">(</span><span class="o">*</span><span class="n">parse</span><span class="p">(</span><span class="n">arg</span><span class="p">))</span>
    <span class="k">def</span> <span class="nf">do_position</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s">&#39;Print the current turle position:  POSITION&#39;</span>
        <span class="nb">print</span><span class="p">(</span><span class="s">&#39;Current position is %d %d</span><span class="se">\n</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">position</span><span class="p">())</span>
    <span class="k">def</span> <span class="nf">do_heading</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s">&#39;Print the current turle heading in degrees:  HEADING&#39;</span>
        <span class="nb">print</span><span class="p">(</span><span class="s">&#39;Current heading is %d</span><span class="se">\n</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">heading</span><span class="p">(),))</span>
    <span class="k">def</span> <span class="nf">do_color</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s">&#39;Set the color:  COLOR BLUE&#39;</span>
        <span class="n">color</span><span class="p">(</span><span class="n">arg</span><span class="o">.</span><span class="n">lower</span><span class="p">())</span>
    <span class="k">def</span> <span class="nf">do_undo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s">&#39;Undo (repeatedly) the last turtle action(s):  UNDO&#39;</span>
    <span class="k">def</span> <span class="nf">do_reset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s">&#39;Clear the screen and return turtle to center:  RESET&#39;</span>
        <span class="n">reset</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">do_bye</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s">&#39;Stop recording, close the turtle window, and exit:  BYE&#39;</span>
        <span class="nb">print</span><span class="p">(</span><span class="s">&#39;Thank you for using Turtle&#39;</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
        <span class="n">bye</span><span class="p">()</span>
        <span class="k">return</span> <span class="k">True</span>

    <span class="c"># ----- record and playback -----</span>
    <span class="k">def</span> <span class="nf">do_record</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s">&#39;Save future commands to filename:  RECORD rose.cmd&#39;</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">file</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="s">&#39;w&#39;</span><span class="p">)</span>
    <span class="k">def</span> <span class="nf">do_playback</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
        <span class="s">&#39;Playback commands from a file:  PLAYBACK rose.cmd&#39;</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">cmdqueue</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span><span class="o">.</span><span class="n">splitlines</span><span class="p">())</span>
    <span class="k">def</span> <span class="nf">precmd</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">line</span><span class="p">):</span>
        <span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">file</span> <span class="ow">and</span> <span class="s">&#39;playback&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span>
            <span class="nb">print</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="n">file</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">line</span>
    <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">file</span> <span class="o">=</span> <span class="k">None</span>

<span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
    <span class="s">&#39;Convert a series of zero or more numbers to an argument tuple&#39;</span>
    <span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">arg</span><span class="o">.</span><span class="n">split</span><span class="p">()))</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
    <span class="n">TurtleShell</span><span class="p">()</span><span class="o">.</span><span class="n">cmdloop</span><span class="p">()</span>
</pre></div>
</div>
<p>Here is a sample session with the turtle shell showing the help functions, using
blank lines to repeat commands, and the simple record and playback facility:</p>
<div class="highlight-python3"><div class="highlight"><pre>Welcome to the turtle shell.   Type help or ? to list commands.

(turtle) ?

Documented commands (type help &lt;topic&gt;):
========================================
bye     color    goto     home  playback  record  right
circle  forward  heading  left  position  reset   undo

(turtle) help forward
Move the turtle forward by the specified distance:  FORWARD 10
(turtle) record spiral.cmd
(turtle) position
Current position is 0 0

(turtle) heading
Current heading is 0

(turtle) reset
(turtle) circle 20
(turtle) right 30
(turtle) circle 40
(turtle) right 30
(turtle) circle 60
(turtle) right 30
(turtle) circle 80
(turtle) right 30
(turtle) circle 100
(turtle) right 30
(turtle) circle 120
(turtle) right 30
(turtle) circle 120
(turtle) heading
Current heading is 180

(turtle) forward 100
(turtle)
(turtle) right 90
(turtle) forward 100
(turtle)
(turtle) right 90
(turtle) forward 400
(turtle) right 90
(turtle) forward 500
(turtle) right 90
(turtle) forward 400
(turtle) right 90
(turtle) forward 300
(turtle) playback spiral.cmd
Current position is 0 0

Current heading is 0

Current heading is 180

(turtle) bye
Thank you for using Turtle
</pre></div>
</div>
</div>
</div>


          </div>
        </div>
      </div>
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper">
  <h3><a href="../contents.html">Table Of Contents</a></h3>
  <ul>
<li><a class="reference internal" href="#">24.2. <tt class="docutils literal"><span class="pre">cmd</span></tt> &#8212; Support for line-oriented command interpreters</a><ul>
<li><a class="reference internal" href="#cmd-objects">24.2.1. Cmd Objects</a></li>
<li><a class="reference internal" href="#cmd-example">24.2.2. Cmd Example</a></li>
</ul>
</li>
</ul>

  <h4>Previous topic</h4>
  <p class="topless"><a href="turtle.html"
                        title="previous chapter">24.1. <tt class="docutils literal"><span class="pre">turtle</span></tt> &#8212; Turtle graphics</a></p>
  <h4>Next topic</h4>
  <p class="topless"><a href="shlex.html"
                        title="next chapter">24.3. <tt class="docutils literal"><span class="pre">shlex</span></tt> &#8212; Simple lexical analysis</a></p>
<h3>This Page</h3>
<ul class="this-page-menu">
  <li><a href="../bugs.html">Report a Bug</a></li>
  <li><a href="../_sources/library/cmd.txt"
         rel="nofollow">Show Source</a></li>
</ul>

<div id="searchbox" style="display: none">
  <h3>Quick search</h3>
    <form class="search" action="../search.html" method="get">
      <input type="text" name="q" />
      <input type="submit" value="Go" />
      <input type="hidden" name="check_keywords" value="yes" />
      <input type="hidden" name="area" value="default" />
    </form>
    <p class="searchtip" style="font-size: 90%">
    Enter search terms or a module, class or function name.
    </p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
        </div>
      </div>
      <div class="clearer"></div>
    </div>  
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="../genindex.html" title="General Index"
             >index</a></li>
        <li class="right" >
          <a href="../py-modindex.html" title="Python Module Index"
             >modules</a> |</li>
        <li class="right" >
          <a href="shlex.html" title="24.3. shlex — Simple lexical analysis"
             >next</a> |</li>
        <li class="right" >
          <a href="turtle.html" title="24.1. turtle — Turtle graphics"
             >previous</a> |</li>
        <li><img src="../_static/py.png" alt=""
                 style="vertical-align: middle; margin-top: -1px"/></li>
        <li><a href="https://www.python.org/">Python</a> &raquo;</li>
        <li>
          <span class="version_switcher_placeholder">3.4.3</span>
          <a href="../index.html">Documentation</a> &raquo;
        </li>

          <li><a href="index.html" >The Python Standard Library</a> &raquo;</li>
          <li><a href="frameworks.html" >24. Program Frameworks</a> &raquo;</li> 
      </ul>
    </div>  
    <div class="footer">
    &copy; <a href="../copyright.html">Copyright</a> 1990-2015, Python Software Foundation.
    <br />
    The Python Software Foundation is a non-profit corporation.
    <a href="https://www.python.org/psf/donations/">Please donate.</a>
    <br />
    Last updated on Jun 15, 2015.
    <a href="../bugs.html">Found a bug</a>?
    <br />
    Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.2.3.
    </div>

  </body>
</html>